From: Colin Walters Date: Tue, 9 Feb 2010 18:24:33 +0000 (-0500) Subject: Add st_texture_cache_load_file_to_cogl_texture X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~10356 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=5ce1e3fe92ac16fa66b6cb65de794ab86eabe54e;p=gnome-shell.git Add st_texture_cache_load_file_to_cogl_texture For StWidget we want the ability to load raw CoglHandle references rather than having a big pile of actors backing StWidget. Several bits of StWidget expect to be able to synchronously load textures; this is a crutch to support that until we can cleanly make this asynchronous. https://bugzilla.gnome.org/show_bug.cgi?id=607500 --- diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c index ddf894658..15c35ecac 100644 --- a/src/st/st-texture-cache.c +++ b/src/st/st-texture-cache.c @@ -1085,6 +1085,48 @@ st_texture_cache_load_uri_async (StTextureCache *cache, return CLUTTER_ACTOR (texture); } +static CoglHandle +st_texture_cache_load_uri_sync_to_cogl_texture (StTextureCache *cache, + StTextureCachePolicy policy, + const gchar *uri, + int available_width, + int available_height, + GError **error) +{ + CoglHandle texdata; + GdkPixbuf *pixbuf; + CacheKey key; + + memset (&key, 0, sizeof (CacheKey)); + key.policy = policy; + key.uri = (char*)uri; + key.size = available_width; + + texdata = g_hash_table_lookup (cache->priv->keyed_cache, &key); + + if (texdata == NULL) + { + pixbuf = impl_load_pixbuf_file (uri, available_width, available_height, error); + if (!pixbuf) + { + return COGL_INVALID_HANDLE; + } + + texdata = pixbuf_to_cogl_handle (pixbuf); + g_object_unref (pixbuf); + + if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER) + { + cogl_handle_ref (texdata); + g_hash_table_insert (cache->priv->keyed_cache, cache_key_dup (&key), texdata); + } + } + else + cogl_handle_ref (texdata); + + return texdata; +} + /** * st_texture_cache_load_uri_sync: * @@ -1111,44 +1153,54 @@ st_texture_cache_load_uri_sync (StTextureCache *cache, int available_height, GError **error) { - ClutterTexture *texture; CoglHandle texdata; - GdkPixbuf *pixbuf; - CacheKey key; + ClutterTexture *texture; + + texdata = st_texture_cache_load_uri_sync_to_cogl_texture (cache, policy, uri, available_width, available_height, error); + + if (texdata == COGL_INVALID_HANDLE) + return NULL; texture = create_default_texture (cache); + set_texture_cogl_texture (texture, texdata); + cogl_handle_unref (texdata); - memset (&key, 0, sizeof (CacheKey)); - key.policy = policy; - key.uri = (char*)uri; - key.size = available_width; - texdata = g_hash_table_lookup (cache->priv->keyed_cache, &key); + return CLUTTER_ACTOR (texture); +} - if (texdata == NULL) - { - pixbuf = impl_load_pixbuf_file (uri, available_width, available_height, error); - if (!pixbuf) - { - g_object_unref (texture); - return NULL; - } +/** + * st_texture_cache_load_file_to_cogl_texture: + * @cache: A #StTextureCache + * @file_path: Path to a file in supported image format + * + * This function synchronously loads the given file path + * into a COGL texture. On error, a warning is emitted + * and %COGL_INVALID_HANDLE is returned. + */ +CoglHandle +st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache, + const gchar *file_path) +{ + CoglHandle texture; + GFile *file; + char *uri; + GError *error = NULL; - texdata = pixbuf_to_cogl_handle (pixbuf); - g_object_unref (pixbuf); + file = g_file_new_for_path (file_path); + uri = g_file_get_uri (file); - set_texture_cogl_texture (texture, texdata); + texture = st_texture_cache_load_uri_sync_to_cogl_texture (cache, ST_TEXTURE_CACHE_POLICY_FOREVER, + uri, -1, -1, &error); + g_object_unref (file); + g_free (uri); - if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER) - { - g_hash_table_insert (cache->priv->keyed_cache, cache_key_dup (&key), texdata); - } - else - cogl_handle_unref (texdata); + if (texture == NULL) + { + g_warning ("Failed to load %s: %s", file_path, error->message); + g_clear_error (&error); + return COGL_INVALID_HANDLE; } - else - set_texture_cogl_texture (texture, texdata); - - return CLUTTER_ACTOR (texture); + return texture; } /** diff --git a/src/st/st-texture-cache.h b/src/st/st-texture-cache.h index 0c51a38b8..2e6dfd12d 100644 --- a/src/st/st-texture-cache.h +++ b/src/st/st-texture-cache.h @@ -80,6 +80,9 @@ ClutterActor *st_texture_cache_load_uri_sync (StTextureCache *cache, int available_height, GError **error); +CoglHandle st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache, + const gchar *file_path); + ClutterActor *st_texture_cache_load_file_simple (StTextureCache *cache, const gchar *file_path);